<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <xsl:output method="xml" omit-xml-declaration="yes"/>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Templates de génération HTML                                                                                  -->
  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour les alternatives
       Dans ce template, le contexte est un scénario (tag <scn>)
    -->
  <xsl:template name="genHtmForAlt" >
    <xsl:param name="p_lgnCls"/>

    <xsl:variable name="posAlt" select="$p_lgnCls"/>

    <!-- Ligne d'entête d'une alternative donnée avec son nom -->
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td><xsl:value-of select="nom"/></td>
      <td colspan="5"><xsl:value-of select="dsc"/></td>
    </tr>

    <xsl:for-each select="cmmlst/cmmLst/cmm">
      <xsl:call-template name="genHtmForEtpAlt">
        <xsl:with-param name="p_lgnCls" select="$posAlt">
        </xsl:with-param>
      </xsl:call-template>
    </xsl:for-each>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour un commentaire donné
       Dans ce template, le contexte est un commentaire (tag <cmm>)
    -->
  <xsl:template name="genHtmForCmm" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td>
        <xsl:value-of select="txt"/>
      </td>
      <td class="tblCllPtt">
        <xsl:value-of select="nom"/>
      </td>
    </tr>
  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une liste de commentaires
       Dans ce template, le contexte est une liste de commentaires (tag <cmmLst>)
    -->
  <xsl:template name="genHtmForCmmLst" >

    <xsl:if test="count( cmm ) > 0" >

      <table class="tbl">
        <tr class="tblLgnHdr">
          <th>Texte</th>
          <th>Nom</th>
        </tr>

          <xsl:for-each select="cmm">
            <xsl:call-template name="genHtmForCmm">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

      </table>
    </xsl:if>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une étape d'une alternative
       Dans ce template, le contexte est un commentaire (tag <cmm>)
    -->
  <xsl:template name="genHtmForEtpAlt" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td class="tblCll">
      </td>
      <td>
        <xsl:value-of select="nmrOrd"/>
      </td>
      <xsl:choose>
        <xsl:when test="contains( nom, 'Eas' )">
          <td>
            <xsl:value-of select="txt"/>
          </td>
          <td class="tblCllPtt">
            <xsl:value-of select="nom"/>
          </td>
          <td></td>
          <td></td>
        </xsl:when>
        <xsl:when test="contains( nom, 'Ess' )">
          <td></td>
          <td></td>
          <td>
            <xsl:value-of select="txt"/>
          </td>
          <td class="tblCllPtt">
            <xsl:value-of select="nom"/>
          </td>
        </xsl:when>
      </xsl:choose>
    </tr>
  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une étape du scénario optimum
       Dans ce template, le contexte est une étape (tag <etp>)
    -->
  <xsl:template name="genHtmForEtpScnOpt" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td>
        <xsl:value-of select="nmrOrd"/>
      </td>
      <td>
        <xsl:value-of select="act/nom"/>
      </td>
      <td>
        <xsl:value-of select="dscEtp"/>
      </td>
      <td>
        <xsl:value-of select="nom"/>
      </td>
    </tr>
  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour le scénario optimum
       Dans ce template, le contexte est un scénario (tag <scn>)
    -->
  <xsl:template name="genHtmForScnOpt" >

    <xsl:if test="count( etpLst/etp ) > 0" >

      <table class="tbl">
        <tr class="tblLgnHdr">
          <th>No</th>
          <th>Acteur</th>
          <th>Description</th>
          <th>Nom</th>
        </tr>

          <xsl:for-each select="etpLst/etp">
            <xsl:call-template name="genHtmForEtpScnOpt">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

      </table>
    </xsl:if>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour les uses cases incluant le use case traité
       Dans ce template, le contexte est un usecase (tag <ucs>)
    -->
  <xsl:template name="genHtmForUcsRfr" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td><xsl:value-of select="nom" /></td>
      <td><xsl:value-of select="dsc"/></td>
      <td class="tblCllNmr"><xsl:value-of select="scnOpt"/></td>
    </tr>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Templates de changement de contexte                                                                           -->
  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

  <xsl:template match="/">
    <!-- Rappel : Le HTML généré sera inséré dans une balise <div> -->
    <h1>Fiche détaillée du usecase <xsl:value-of select="doc/ttr"/></h1>

    <xsl:if test="count( doc/ucs ) > 0" >
      <table class="tbl">

        <tr>
          <th class="tblHdrLft">Nom</th>
          <td class="tblCllHdr">
            <xsl:value-of select="doc/ucs/ucs/nom"/>
          </td>
        </tr>
        <tr>
          <th class="tblHdrLft">Description</th>
          <td class="tblCllHdr">
            <xsl:value-of select="doc/ucs/ucs/dscUcs"/>
          </td>
        </tr>
        <tr>
          <th class="tblHdrLft">Acteur principal</th>
          <td class="tblCllHdr">
            <xsl:value-of select="doc/ucs/ucs/act"/>
          </td>
        </tr>
        <tr>
          <th class="tblHdrLft">Evènement déclencheur</th>
          <td class="tblCllHdr">
            <xsl:value-of select="doc/ucs/ucs/evnDcl"/>
          </td>
        </tr>

        <!-- Informations d'audit ///////////////////////////////////////// -->
        <tr>
          <td class="tblHdrLft">
            Création
          </td>
          <td class="tblCllHdr">
            <xsl:value-of select="doc/ucs/ucs/audit/datCre"/>
          </td>
        </tr>
        <tr>
          <td class="tblHdrLft">
            Dern. màj
          </td>
          <td class="tblCllHdr">
            <xsl:value-of select="doc/ucs/ucs/audit/datMaj"/>
          </td>
        </tr>
      </table>

      <!-- // Les préconditions du use case //////////////////////////////////////////////////////// -->

      <h2>Les pré-conditions</h2>
      <xsl:for-each select="doc/ucs/preCndLst">
        <xsl:call-template name="genHtmForCmmLst">
          <xsl:with-param name="p_lgnCls">
            <xsl:choose>
              <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
              <xsl:otherwise>tblLgnImp</xsl:otherwise>
            </xsl:choose>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:for-each>

      <!-- // Les postconditions du use case /////////////////////////////////////////////////////// -->

      <h2>Les post-conditions</h2>
      <xsl:for-each select="doc/ucs/pstCndLst">
        <xsl:call-template name="genHtmForCmmLst">
          <xsl:with-param name="p_lgnCls">
            <xsl:choose>
              <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
              <xsl:otherwise>tblLgnImp</xsl:otherwise>
            </xsl:choose>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:for-each>

      <!-- // Les étapes du use case ////////////////////////////////////////////////////////////// -->

      <h2>Les étapes du scénario optimum</h2>
      <xsl:for-each select="doc/ucs/scnOpt/scn">
        <xsl:call-template name="genHtmForScnOpt">
          <xsl:with-param name="p_lgnCls">
            <xsl:choose>
              <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
              <xsl:otherwise>tblLgnImp</xsl:otherwise>
            </xsl:choose>
          </xsl:with-param>
        </xsl:call-template>
      </xsl:for-each>

      <!-- // Les alternatives du use case //////////////////////////////////////////////////////// -->

      <h2>Les alternatives</h2>

      <xsl:if test="count( doc/ucs/altLst/scn ) > 0" >

        <!-- Entête de la table des alternatives -->
        <table class="tbl">
          <tr class="tblLgnHdr">
            <th>Alternative</th>
            <th>No</th>
            <th>Acteur</th>
            <th>Nom</th>
            <th>Système</th>
            <th>Nom</th>
          </tr>

          <xsl:for-each select="doc/ucs/altLst/scn">
            <xsl:call-template name="genHtmForAlt">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

        </table>

      </xsl:if>

      <!-- // Les usecases dans lesquels ce use case est inclus /////////////////////////////////// -->

      <h2>Les use cases dans lesquels le use case est inclus</h2>

      <xsl:if test="count( doc/ucs/incDnsLst/ucs ) > 0 ">
        <table class="tbl">
          <tr class="tblLgnHdr">
            <th>Nom</th>
            <th>Description</th>
            <th>Nb. étapes</th>
          </tr>

          <xsl:for-each select="doc/ucs/incDnsLst/ucs">
            <xsl:call-template name="genHtmForUcsRfr">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

        </table>
      </xsl:if>

      <!-- // Les usecases qui étendent le usecase traité ///////////////////////////////////// -->

      <h2>Les usecases qui étendent le usecase <xsl:value-of select="nom"/></h2>

      <xsl:if test="count( doc/ucs/etnParLst/ucs ) > 0 ">
        <table class="tbl">
          <tr class="tblLgnHdr">
            <th>Nom</th>
            <th>Description</th>
            <th>Nb. étapes</th>
          </tr>

          <xsl:for-each select="doc/ucs/etnParLst/ucs">
            <xsl:call-template name="genHtmForUcsRfr">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

        </table>
      </xsl:if>

    </xsl:if>

  </xsl:template>

</xsl:stylesheet>